package com.itheima.interceptor;

import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
@Component//要像加在工具类上的注解一样加component组件，否则无法通过spring框架加载这个类的对象
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override//目标资源方法执行前的 执行逻辑
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("登录校验拦截器逻辑");
//        HttpServletRequest req = (HttpServletRequest) request;//它这里是因为filter中是ServletRequest,要强转HttpServlet，
//        HttpServletResponse resp = (HttpServletResponse) response;

        //1.获取请求url。
        String url = request.getRequestURL().toString();
        log.info("url:{}",url);
        //2.判断请求url中是否包含login，如果包含，说明是登录操作，放行。
        if (url.contains("login")){
            log.info("该请求是登录请求，放心");
            return true;
        }

        //3.获取请求头中的令牌（token）。
        String jwt = request.getHeader("token");

        //4.判断令牌是否存在，如果不存在，返回错误结果（未登录）。
        if(jwt==null){
            Result error = Result.error("NOT_LOGIN");//建立一个Result对象
//            JSONObject.toJSONString(error);//这里本来是用阿里巴巴fastjson插件将   对象-->json的
            return false;
        }

        //5.解析token，如果解析失败，返回错误结果（未登录）。
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            return false;//解析失败
        }

        //6.放行。
        return true;
    }

    @Override//目标方法执行后的 要执行的逻辑
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行完登录校验后...");
    }

    @Override//视图渲染完毕后执行的代码
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("视图渲染完毕后...");
    }
}
